package com.xiaoxing.zhinenghuacangku.mvp.model.service;

import com.xiaoxing.zhinenghuacangku.mvp.model.entity.UserInfo;
import com.xiaoxing.zhinenghuacangku.mvp.ui.entity.LiYiChuKu;
import com.xiaoxing.zhinenghuacangku.mvp.ui.entity.LinYiKaiGuanMen;
import com.xiaoxing.zhinenghuacangku.mvp.ui.entity.RuKuQingZhang;
import com.xiaoxing.zhinenghuacangku.mvp.ui.entity.YiKu;
import com.xiaoxing.zhinenghuacangku.mvp.ui.entity.ZhiJianRuKu;
import com.xiaoxing.zhinenghuacangku.mvp.ui.entity.ZhiKongHuanChongWei;

import java.util.Map;

import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
 * @author 小星 QQ:753940262
 * @class describe
 * @time 2018/11/12 0012 13:48
 */
public interface ZhiNengCangKuService {


    /**
     * 返回 user_id
     * isauto:1 代表管理自动仓库 0 代表管理一般仓库
     * sid :自动仓库的id
     *
     * @param user_id
     * @return
     */
//    @Headers({"Domain-Name: douban"})
    @GET("/storeservice.asmx/GetUserInfo")
    Observable<UserInfo> getUserInfo(
            @Query("user_id") String user_id
    );

    /**
     * 入库 扫描入库缓冲位二维码,调用此方法,传入二维码里的id,将此缓冲位置满,如果设置成功,返回true
     * 设置失败 返回false,失败的原因有：1.此缓冲位已占满 2.此缓冲位没有启用 3.此缓冲位是出库缓冲位(标签贴错)
     *
     * @param bufferId
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/SetInstoreBufferReadyForAGV")
    Observable<String> setInstoreBufferReadyForAGV(
            @Field("bufferId") String bufferId,
            @Field("spname") String spid
    );

    /**
     * 选仓位
     * 用法同GetUserSpaceList
     * 多了一个字段 isauto，表明此仓位是否为立库仓位  用于提示用户
     *
     * @param user_id
     * @param spname  仓位的名字，为空的时候表示查询所有的
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/GetUserSpaceListForAutoStore")
    Observable<String> getUserSpaceListForAutoStore(
            @Field("user_id") String user_id,
            @Field("spname") String spname
    );

    //    /**
//     * 生成标签
//     *
//     * @param did    待入库列表中返回的did
//     * @param uid    登录用户id
//     * @param num    用户填写的入库数量
//     * @param imgStr 入库图片
//     * @return
//     */
//    @Multipart
//    @POST("/storeservice.asmx/CreateMaterialForInstoreAuto")
//    Observable<String> createMaterialForInstoreAuto(
//            @Part("did") RequestBody did,
//            @Part("uid") RequestBody uid,
//            @Part("num") RequestBody num,
////            @("imgStr") String imgStr
//            @Part MultipartBody.Part imgStr
//
//    );
    @FormUrlEncoded
    @POST("/storeservice.asmx/CreateMaterialForInstoreAuto")
    Observable<String> createMaterialForInstoreAuto(
            @FieldMap Map<String, String> params
    );

    /**
     * 出库扫描物料或缓冲位置出错时，重置扫描状态
     * public bool ResetOutStorageListScanStatus(string out_storageList_id)
     *
     * @param params out_storageList_id
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/ResetOutStorageListScanStatus")
    Observable<String> resetOutStorageListScanStatus(
            @FieldMap Map<String, String> params
    );

    /**
     * 入库操作
     *
     * @param mid             上步返回的mid
     * @param instoreBufferId 扫描的入库缓冲位id
     * @param spid            仓位（可以是立库仓位  也可以是地面仓位 用户自己选择）
     * @param num             入库数量
     * @param uid
     * @param remark
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/InstoreCallAGV")
    Observable<String> addAgvTask(
            @Field("mid") String mid,
            @Field("instoreBufferId") String instoreBufferId,
            @Field("spid") String spid,
            @Field("num") String num,
            @Field("uid") String uid,
            @Field("remark") String remark
    );

    /**
     * 退库的时候扫描物料二维码，如果仓位托盘不存在，显示选择仓位
     *
     * @param mid
     * @param instoreBufferId
     * @param spid
     * @param num
     * @param uid
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/AddAgvTaskInstore")
    Observable<String> AddAgvTaskInstore(
            @Field("mid") String mid,
            @Field("instoreBufferId") String instoreBufferId,
            @Field("spid") String spid,
            @Field("num") String num,
            @Field("uid") String uid
    );

    /**
     * 搜索获取物料列表
     *
     * @param user_id
     * @param orderNo
     * @param projectName
     * @param material
     * @param projectNo
     * @param sname
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/GetDistributeList")
    Observable<String> getDistributeList(
            @Field("user_id") String user_id,
            @Field("orderNo") String orderNo,
            @Field("projectName") String projectName,
            @Field("material") String material,
            @Field("projectNo") String projectNo,
            @Field("sname") String sname
    );

    /**
     * 退库
     *
     * @param mid
     * @param instoreBufferId
     * @param uid
     * @param num
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/ReturnInstore")
    Observable<String> returnInstore(
            @Field("mid") String mid,
            @Field("instoreBufferId") String instoreBufferId,
            @Field("uid") String uid,
            @Field("num") String num
    );

    /**
     * 退库的时候   先去拿仓位上的托盘
     *
     * @param mid
     * @param instoreBufferId
     * @param uid
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/ReturnGetMaterialPlate")
    Observable<String> ReturnGetMaterialPlate(
            @Field("mid") String mid,
            @Field("instoreBufferId") String instoreBufferId,
            @Field("uid") String uid
    );

    /**
     * 确认是否可以退库(退库时轮询此函数，当返回true 则可以调用ReturnInstore)
     * 1 可以调用 0 不可以调用
     *
     * @param mid
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/CheckCanReturnInstoreBuffer")
    Observable<String> CheckCanReturnInstoreBuffer(
            @Field("mid") String mid
    );

    /**
     * 出库
     *
     * @param uid                登录用户id
     * @param mid                扫描出库缓冲区物品上的二维码id
     * @param out_storageList_id 扫描出库缓冲区的二维码id
     * @param bufferId           待出库列表中绑定的out_storageList_id
     * @param taskId             待出库列表中绑定的taskID
     * @return 返回值: 1:出库成功 0:出库失败 2:未全部出完 需要运回
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/OutStoreForAndroidAuto")
    Observable<String> outStoreForAndroidAuto(
            @Field("uid") String uid,
            @Field("mid") String mid,
            @Field("out_storageList_id") String out_storageList_id,
            @Field("bufferId") String bufferId,
            @Field("taskId") String taskId
    );

    /**
     * 取消拿货
     *
     * @param uid                登录用户id
     * @param mid                扫描出库缓冲区物品上的二维码id
     * @param out_storageList_id 扫描出库缓冲区的二维码id
     * @param bufferId           待出库列表中绑定的out_storageList_id
     * @param taskId             待出库列表中绑定的taskID
     * @return 返回值: 1:出库成功 0:出库失败 2:未全部出完 需要运回
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/ReturnMaterialAllAutoStore")
    Observable<String> returnMaterialAllAutoStore(
            @Field("uid") String uid,
            @Field("mid") String mid,
            @Field("out_storageList_id") String out_storageList_id,
            @Field("bufferId") String bufferId,
            @Field("taskId") String taskId
    );

    /**
     * 运回
     *
     * @param out_storageList_id 待出库列表中绑定的out_storageList_id
     * @param mid                待出库列表中绑定的mid
     * @param uid                登录用户id
     * @return 返回值:agv的taskId
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/ReturnMaterialAutoStore")
    Observable<String> returnMaterialAutoStore(
            @Field("out_storageList_id") String out_storageList_id,
            @Field("mid") String mid,
            @Field("uid") String uid
    );

    /**
     * 点运回的时候调用，更新后台状态
     *
     * @param out_storageList_id 待出库列表中绑定的out_storageList_id
     * @param backStatus         状态  1是操作过
     * @return 返回值:agv的taskId
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/UpdateOutStorageListBackStatus")
    Observable<String> UpdateOutStorageListBackStatus(
            @Field("out_storageList_id") String out_storageList_id,
            @Field("backStatus") String backStatus
    );

    /**
     * 扫描缓冲位置的时候调用，更新后台状态
     *
     * @param out_storageList_id 待出库列表中绑定的out_storageList_id
     * @param bufferStatus)      状态  1是操作过
     * @return 返回值:agv的taskId
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/UpdateOutStorageListScanBufferStatus")
    Observable<String> UpdateOutStorageListScanBufferStatus(
            @Field("out_storageList_id") String out_storageList_id,
            @Field("bufferStatus") String bufferStatus,
            @Field("bufferId") String bufferId
    );

    /**
     * 扫描物料的时候调用，更新后台状态
     *
     * @param out_storageList_id 待出库列表中绑定的out_storageList_id
     * @param mStatus)           状态  1是操作过
     * @return 返回值:agv的taskId
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/UpdateOutStorageListScanMaterialStatus")
    Observable<String> UpdateOutStorageListScanMaterialStatus(
            @Field("out_storageList_id") String out_storageList_id,
            @Field("mStatus") String mStatus,
            @Field("mid") String mid
    );

    /**
     * 点击出库的时候调用，更新后台状态(后台更新，手机端不用主动调用)
     *
     * @param out_storageList_id 待出库列表中绑定的out_storageList_id
     * @param outStatus)         状态  1是操作过
     * @return 返回值:agv的taskId
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/UpdateOutStorageListOutStatus")
    Observable<String> UpdateOutStorageListOutStatus(
            @Field("out_storageList_id") String out_storageList_id,
            @Field("outStatus") String outStatus
    );

    /**
     * 查询待出库列表
     *
     * @param userPhone 手机号
     * @param uid       仓管员登录app的id
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/SearchOutStorageListAutoStore")
    Observable<String> searchOutStorageListAutoStore(
            @Field("userPhone") String userPhone,
            @Field("uid") String uid
    );

    /**
     * 手动调用机器人
     *
     * @param out_storagelist_batchid 入参:out_storagelist_batchid:上一步返回的out_storagelist_batchid
     * @return 返回值:添加任务是否成功 true:添加任务成功 false:添加任务失败
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/CallAutoMachineGetMaterial")
    Observable<String> callAutoMachineGetMaterial(
            @Field("out_storagelist_batchid") String out_storagelist_batchid,
            @Field("uid") String uid
    );

    /**
     * 验证物料二维码的有效性
     *
     * @param mid
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/ValidateReturnInstore")
    Observable<String> validateReturnInstore(
            @Field("mid") String mid
    );

    /**
     * 获取项目列表
     *
     * @param user_id
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/GetModelListProjectInfo")
    Observable<String> getModelListProjectInfo(
            @Field("user_id") String user_id
    );

    /**
     * 处理异常
     *
     * @param out_storageList_id
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/FinishErrorTask")
    Observable<String> finishErrorTask(
            @Field("out_storageList_id") String out_storageList_id
    );

    /**
     * 设置缓冲位置为空,可以使用
     *
     * @param bufferId
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/CancelBufferReadyForAGV")
    Observable<String> cancelBufferReadyForAGV(
            @Field("bufferId") String bufferId
    );


    Observable<YiKu> getYiKuData(Map<String, String> map);

    Observable<RuKuQingZhang> getRuKuQingZhangData(Map<String, String> map);

    /**
     * 入库时清理错误-扫描物料的二维码
     * 1;//命令发送完成
     * -1;//入库区不可用
     * 0;//操作不合法
     *
     * @param mid
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/CallAgvGetMaterialToInstoreBuffer")
    Observable<String> callAgvGetMaterialToInstoreBuffer(
            @Field("mid") String mid
    );

    /**
     * 入库时清理错误-循环检查缓冲位置是否可用
     *
     * @param mid
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/CheckCanReInstore")
    Observable<String> checkCanReInstore(
            @Field("mid") String mid
    );

    /**
     * 入库时清理错误-重新入库
     *
     * @param mid
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/InstoreAgain")
    Observable<String> instoreAgain(
            @Field("mid") String mid
    );

    /**
     * 置空缓冲位置0
     *
     * @param bufferid
     * @param status
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/UpdateStoreBufferStatusManually")
    Observable<String> updateStoreBufferStatusManually(
            @Field("bufferid") String bufferid,
            @Field("status") String status
    );

    Observable<ZhiKongHuanChongWei> getZhiKongHuanChongWeiData(Map<String, String> map);

    /**
     * 移库清障
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("/storeservice.asmx/SendMaterialMoveOrderAgain")
    Observable<String> sendMaterialMoveOrderAgain(@FieldMap Map<String, String> map);

    Observable<LiYiChuKu> getLiYiChuKuData(Map<String, String> map);

    Observable<LinYiKaiGuanMen> getLinYiKaiGuanMenData(Map<String, String> map);

    Observable<ZhiJianRuKu> getZhiJianRuKuData(Map<String, String> map);
}
